home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 2000 July / macformat-092.iso / Dreamweaver 3 / Configuration / Shared / MM / Scripts / navBar.js < prev    next >
Encoding:
Text File  |  1999-12-01  |  30.4 KB  |  991 lines

  1. // Copyright 1999 Macromedia, Inc. All rights reserved.
  2.  
  3. // This file contains classes and functions for working
  4. //  with Navigation Bars
  5. //
  6.  
  7. /*------------------------------------------------------------------*/
  8.  
  9. //This class represents a navigation bar
  10. //
  11. function NavBar(theSourceDoc, theGroupName) {
  12.   //properties
  13.   this.sourceDoc = theSourceDoc;
  14.  
  15.   this.groupName = (theGroupName) ? theGroupName : 'group1';
  16.   this.isHorizontal = true;
  17.   this.useTable = true;
  18.  
  19.   this.elemList = new Array();
  20.   
  21.   this.orderChanged = false;
  22.   
  23.   this.preloadDelList = new Array();
  24. }
  25.  
  26. //methods
  27. NavBar.prototype.getObjectTag     = NavBar_getObjectTag;
  28. NavBar.prototype.getElemObjectTag = NavBar_getElemObjectTag;
  29. NavBar.prototype.setFromDocument  = NavBar_setFromDocument;
  30. NavBar.prototype.getElemTagList   = NavBar_getElemTagList;
  31. NavBar.prototype.getMapFromImage  = NavBar_getMapFromImage;
  32. NavBar.prototype.updateDocument   = NavBar_updateDocument;
  33.  
  34. NavBar.prototype.getViewNames = NavBar_getViewNames;
  35. NavBar.prototype.getElem      = NavBar_getElem;
  36. NavBar.prototype.addElem      = NavBar_addElem;
  37. NavBar.prototype.removeElem   = NavBar_removeElem;
  38. NavBar.prototype.moveElemUp   = NavBar_moveElemUp;
  39. NavBar.prototype.moveElemDown = NavBar_moveElemDown;
  40. NavBar.prototype.isComplete   = NavBar_isComplete;
  41.  
  42. //static properties
  43. NavBar.HorizElem = "%s";
  44. NavBar.VertElem = "%s<br>";
  45. NavBar.HorizTable = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>%s</tr></table>";
  46. NavBar.HorizTableElem = "<td>%s</td>";
  47. NavBar.VertTable = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">%s</table>";
  48. NavBar.VertTableElem = "<tr><td>%s</td></tr>";
  49.  
  50. //static methods
  51.  
  52.  
  53. //Returns the HTML for the navigation bar
  54. //
  55. function NavBar_getObjectTag() {
  56.   var retVal = '';
  57.   with (this) {
  58.     for (var i=0; i < elemList.length; i++)
  59.       retVal += getElemObjectTag(elemList[i].getObjectTag());
  60.     if (useTable && isHorizontal) {
  61.       retVal = NavBar.HorizTable.replace(/%s/, retVal);
  62.     } else if (useTable && !isHorizontal) {
  63.       retVal = NavBar.VertTable.replace(/%s/, retVal);
  64.   } }
  65.   return retVal;
  66. }
  67.  
  68.  
  69. //Returns the object tag for an element
  70. //
  71. function NavBar_getElemObjectTag(elemTag) {
  72.   var retVal = '';
  73.   with (this) {
  74.     if (useTable && isHorizontal) {
  75.       retVal += NavBar.HorizTableElem.replace(/%s/, elemTag);
  76.     } else if (useTable && !isHorizontal) {
  77.       retVal += NavBar.VertTableElem.replace(/%s/, elemTag);
  78.     } else if (!useTable && isHorizontal) {
  79.       retVal += NavBar.HorizElem.replace(/%s/, elemTag);
  80.     } else if (!useTable && !isHorizontal) {
  81.       retVal += NavBar.VertElem.replace(/%s/, elemTag);
  82.   } }
  83.   return retVal;
  84. }
  85.  
  86.  
  87. //Searches the page for nav bar elements and adds them to the list.
  88. //
  89. function NavBar_setFromDocument() {
  90.   var index, retVal = false;
  91.   var objList = this.getElemTagList();
  92.   for (var i=0; i < objList.length; i++) {
  93.     index = this.addElem();
  94.     this.elemList[index].parseObjectTag(objList[i]);
  95.     retVal = true;
  96.   }
  97.   this.orderChanged = false;
  98.   return retVal;
  99. }
  100.  
  101.  
  102. //Returns the list of nav bar elements on the page
  103. //
  104. function NavBar_getElemTagList() {
  105.   var map, retVal = new Array();
  106.   var docDOM = dw.getDocumentDOM(this.sourceDoc);
  107.   
  108.   // get the list of images, and then find behaviors
  109.   var imgList = docDOM.getElementsByTagName("IMG");
  110.   for (var i=0; i < imgList.length; i++) {
  111.     if (imgList[i].parentNode.tagName == "A") {
  112.       if (NavBarElem.isValidTag(imgList[i].parentNode))
  113.         retVal.push(imgList[i].parentNode);
  114.     } else {
  115.       map = this.getMapFromImage(imgList[i]);
  116.       if (map && NavBarElem.isValidTag(map)) {
  117.         areaList = map.getElementsByTagName("AREA");
  118.         for (var j=0; j < areaList.length; j++) {
  119.           if (NavBarElem.isValidTag(areaList[j]))
  120.             retVal.push(areaList[j]);
  121.   } } } }
  122.   return retVal;
  123. }
  124.  
  125. function NavBar_getMapFromImage(image) {
  126.   var retVal = '';
  127.   var docDOM = dw.getDocumentDOM(this.sourceDoc);
  128.   if (image.usemap != null) {
  129.     mapList = docDOM.getElementsByTagName("MAP");
  130.     for (var i=0; !retVal && i < mapList.length; i++) {
  131.       if ("#" + mapList[i].name == image.usemap) 
  132.         retVal = mapList[i];
  133.   } }
  134.   return retVal;
  135. }
  136.  
  137.  
  138. //Updates the nav bar on the page
  139. //
  140. function NavBar_updateDocument() {
  141.   var tdObj, trObj, tableObj, tdList, parentObj;
  142.   var tagList, theObj, lastObj = '';
  143.   var imgElems, insertList, reGetLastObj;
  144.   var docDOM = dw.getDocumentDOM(this.sourceDoc);
  145.   with (this) {
  146.     
  147.     // update elements and store the original tag string
  148.     for (var i=0; i < elemList.length; i++) {
  149.       if (elemList[i].tagObj) {
  150.         elemList[i].updateObjectTag();
  151.         elemList[i].origTag = elemList[i].moveObj.outerHTML;
  152.       } else {
  153.         elemList[i].origTag = elemList[i].getObjectTag();
  154.       }
  155.     }
  156.     
  157.     if (orderChanged) {
  158.  
  159.       tagList = this.getElemTagList();
  160.  
  161.       for (var i=0; i < tagList.length; i++) {
  162.  
  163.         // set theObj
  164.         theObj = '';
  165.         if (tagList[i].tagName == "AREA") {
  166.           mapName = "#" + tagList[i].parentNode.name;
  167.           imgElems = docDOM.getElementsByTagName("IMG");
  168.           for (var j=0; !theObj && j < imgElems.length; j++) {
  169.             if (imgElems[j].usemap == mapName) theObj = imgElems[j];
  170.           }
  171.         } else {
  172.           theObj = tagList[i];
  173.         }
  174.  
  175.         // Set isHorizontal, useTable, and lastObj
  176.         isHorizontal = true;
  177.         useTable = false;
  178.         lastObj = theObj;
  179.         tdObj = lastObj.parentNode;
  180.         if (tdObj.tagName == "TD" && tdObj.childNodes.length == 1) {
  181.           trObj = tdObj.parentNode;
  182.           tableObj = trObj.parentNode;
  183.           if (trObj.tagName == "TR" && tableObj.tagName == "TABLE") {
  184.             useTable = true;
  185.             tdList = trObj.getElementsByTagName("TD");
  186.             if (tdList && tdList.length == 1)
  187.               isHorizontal = false;
  188.         } }
  189.         if (!useTable) {
  190.           parentObj = lastObj.parentNode;
  191.           for (var j=0; j < parentObj.childNodes.length-1; j++) {
  192.             if (parentObj.childNodes[j] == lastObj &&
  193.                 parentObj.childNodes[j+1].nodeType == Node.ELEMENT_NODE &&
  194.                 parentObj.childNodes[j+1].tagName == "BR") {
  195.               isHorizontal = false;
  196.               lastObj = parentObj.childNodes[j+1];
  197.         } } }
  198.  
  199.         // update elements
  200.         if (i < elemList.length) {
  201.           reGetLastObj = (theObj == lastObj);
  202.           theObj.outerHTML = "<NAVBARELEM>";
  203.         }
  204.  
  205.         // remove elements
  206.         if (i >= elemList.length) {
  207.           if (useTable) {
  208.             if (isHorizontal)
  209.               tdObj.outerHTML = '';
  210.             else
  211.               trObj.outerHTML = '';
  212.           } else {
  213.             theObj.outerHTML = '';
  214.             if (!isHorizontal)
  215.               lastObj.outerHTML = '';
  216.         } } 
  217.       }
  218.  
  219.       // insert elements
  220.       if (elemList.length > tagList.length) {
  221.         newTag = '';
  222.         for (var i=tagList.length; i < elemList.length; i++)
  223.           newTag += getElemObjectTag("<NAVBARELEM>");
  224.  
  225.         if (useTable) {
  226.           if (isHorizontal)
  227.             trObj.innerHTML = trObj.innerHTML + newTag;
  228.           else
  229.             tableObj.innerHTML = tableObj.innerHTML + newTag;
  230.         } else {
  231.           if (reGetLastObj) {
  232.             insertList = docDOM.getElementsByTagName("NAVBARELEM");
  233.             lastObj = insertList[insertList.length-1];
  234.           }
  235.           lastObj.outerHTML += newTag;
  236.         }
  237.       }
  238.  
  239.       // re-insert the nav bar elements
  240.       var insertList = docDOM.getElementsByTagName("NAVBARELEM");
  241.       for (var i=0; i < elemList.length && i < insertList.length; i++) {
  242.         insertList[i].outerHTML = elemList[i].origTag;
  243.       }
  244.  
  245.       // add new preloads
  246.       for (var i=0; i < elemList.length; i++) {
  247.         if (!elemList[i].tagObj) elemList[i].updatePreloads();
  248.       }
  249.  
  250.       // remove deleted preloads
  251.       if (preloadDelList.length > 0)
  252.         preloadUpdate("", preloadDelList, 0);
  253.     }
  254.   }
  255. }
  256.  
  257.  
  258. function NavBar_getViewNames() {
  259.   var retVal = new Array();
  260.   for (var i=0; i < this.elemList.length; i++)
  261.     retVal.push(this.elemList[i].getViewName());
  262.   return retVal;
  263. }
  264.  
  265.  
  266. function NavBar_getElem(elemIndex) {
  267.   return this.elemList[elemIndex];
  268. }
  269.  
  270.  
  271. function NavBar_addElem(afterIndex, newElem) {
  272.   var retVal = -1;
  273.   afterIndex = (afterIndex != null) ? afterIndex : this.elemList.length-1;
  274.   if (this.elemList.length == 0 ||
  275.       (afterIndex >= -1 && afterIndex < this.elemList.length)) {
  276.     this.orderChanged = true;
  277.     newElem = (newElem) ? newElem : new NavBarElem(this.sourceDoc, this.groupName, this);
  278.     if (this.elemList.length == 0) {
  279.       this.elemList.push(newElem);
  280.       retVal = 0;
  281.     } else {
  282.       this.elemList.splice(afterIndex+1, 0, newElem);
  283.       retVal = afterIndex + 1;
  284.   } }
  285.   return retVal;
  286. }
  287.  
  288. function NavBar_removeElem(elemIndex, ignorePreloads) {
  289.   var retVal = false;
  290.   if (elemIndex >= 0 && elemIndex < this.elemList.length) {
  291.     this.orderChanged = true;
  292.     if (!ignorePreloads)
  293.       this.preloadDelList = this.preloadDelList.concat(this.elemList[elemIndex].preloadOrigList);
  294.     this.elemList.splice(elemIndex, 1);
  295.     retVal = true;
  296.   }
  297.   return retVal;
  298. }
  299.  
  300. function NavBar_moveElemUp(elemIndex) {
  301.   var moveElem, retVal = -1;
  302.   if (elemIndex >= 1 && elemIndex < this.elemList.length) {
  303.     this.orderChanged = true;
  304.     moveElem = this.elemList[elemIndex];
  305.     if (this.removeElem(elemIndex, true))
  306.       retVal = this.addElem(elemIndex - 2, moveElem);
  307.   }
  308.   return retVal;
  309. }
  310.  
  311. function NavBar_moveElemDown(elemIndex) {
  312.   var moveElem, retVal = -1;
  313.   if (elemIndex >= 0 && elemIndex < this.elemList.length - 1) {
  314.     this.orderChanged = true;
  315.     moveElem = this.elemList[elemIndex];
  316.     if (this.removeElem(elemIndex), true)
  317.       retVal = this.addElem(elemIndex, moveElem);
  318.   }
  319.   return retVal;
  320. }
  321.  
  322. function NavBar_isComplete() {
  323.   retVal = true;
  324.   for (var i=0; retVal && i < this.elemList.length; i++) {
  325.     retVal = this.elemList[i].isComplete();
  326.   }
  327.   return retVal;
  328. }
  329.  
  330.  
  331.  
  332.  
  333. /*------------------------------------------------------------------*/
  334.  
  335. //This class represents a navigation bar button
  336. //
  337. function NavBarElem(theSourceDoc, theGroupName, theParent) {
  338.   //properties
  339.   this.sourceDoc = theSourceDoc;
  340.   this.groupName = theGroupName;
  341.   this.parent = theParent;
  342.  
  343.   this.imgName = this.getUniqueName(LABEL_unnamed, true);
  344.   this.nameAutoSet = true;
  345.   this.upImg = '';
  346.   this.overImg = '';
  347.   this.downImg = '';
  348.   this.overDownImg = '';
  349.   this.URL = '';
  350.   this.targetWindow = '';
  351.   this.preloadImages = true;
  352.   this.preloadOrigId = '';
  353.   this.preloadOrigList = new Array();
  354.   this.isDown = false;
  355.  
  356.   this.overImages = new Array();
  357.   this.downImages = new Array();
  358.  
  359.   this.tagObj = '';  // the tag object of an existing element
  360.   this.moveObj = '';  // the image tag or anchor tag object
  361. }
  362.  
  363. //methods
  364. NavBarElem.prototype.getObjectTag    = NavBarElem_getObjectTag;
  365. NavBarElem.prototype.updateObjectTag = NavBarElem_updateObjectTag;
  366. NavBarElem.prototype.updatePreloads  = NavBarElem_updatePreloads;
  367. NavBarElem.prototype.parseObjectTag  = NavBarElem_parseObjectTag;
  368.  
  369. NavBarElem.prototype.getATag = NavBarElem_getATag;
  370. NavBarElem.prototype.getOnLoadCall = NavBarElem_getOnLoadCall;
  371. NavBarElem.prototype.getOnClickCall = NavBarElem_getOnClickCall;
  372. NavBarElem.prototype.getOnMouseOverCall = NavBarElem_getOnMouseOverCall;
  373. NavBarElem.prototype.getOnMouseOutCall = NavBarElem_getOnMouseOutCall;
  374. NavBarElem.prototype.getNBCall = NavBarElem_getNBCall;
  375. NavBarElem.prototype.insertNBCall = NavBarElem_insertNBCall;
  376. NavBarElem.prototype.getPreloadList = NavBarElem_getPreloadList;
  377.  
  378. NavBarElem.prototype.isComplete    = NavBarElem_isComplete;
  379. NavBarElem.prototype.getViewName   = NavBarElem_getViewName;
  380. NavBarElem.prototype.getUniqueName = NavBarElem_getUniqueName;
  381. NavBarElem.prototype.setName       = NavBarElem_setName;
  382. NavBarElem.prototype.setUpImage    = NavBarElem_setUpImage;
  383.  
  384. //static properties
  385. NavBarElem.CloseTag = ">";
  386. NavBarElem.ATagStart = "<a";
  387. NavBarElem.ATagStop = "</a>";
  388. NavBarElem.ALink = "href";
  389. NavBarElem.ATarget = "target";
  390. NavBarElem.AOnClick = "onClick";
  391. NavBarElem.AOnMouseOver = "onMouseOver";
  392. NavBarElem.AOnMouseOut = "onMouseOut";
  393. NavBarElem.ImgTagStart = "<img";
  394. NavBarElem.ImgName = "name";
  395. NavBarElem.ImgSrc = "src";
  396. NavBarElem.ImgBorder = "border";
  397. NavBarElem.ImgOnLoad = "onLoad";
  398. NavBarElem.UpdateFn = "MM_nbGroup";
  399.  
  400. //static methods
  401. NavBarElem.isValidTag = NavBarElem_isValidTag;
  402.  
  403.  
  404. function NavBarElem_getObjectTag() {
  405.   var retVal = '';
  406.   retVal += this.getATag();
  407.   retVal += NavBarElem.ImgTagStart;
  408.   retVal += " " + NavBarElem.ImgName + "=\"" + this.imgName + "\"";
  409.   retVal += " " + NavBarElem.ImgSrc + "=\"" + dw.doURLEncoding((this.isDown && this.downImg) ? this.downImg : this.upImg) + "\"";
  410.   retVal += " " + NavBarElem.ImgBorder + "=\"0\"";
  411.   retVal += " " + NavBarElem.ImgOnLoad + "=\"" + this.getOnLoadCall() + "\"";
  412.   retVal += NavBarElem.CloseTag;
  413.   retVal += NavBarElem.ATagStop;
  414.   return retVal;
  415. }
  416.  
  417.  
  418. function NavBarElem_updateObjectTag(behEvent) {
  419.   var imgElems, imgTag = '', newValue = '';
  420.   if (this.tagObj != '') with (this) {
  421.     
  422.     // set imgTag
  423.     if (tagObj.tagName == "IMG") {
  424.       imgTag = tagObj;
  425.     } else if (tagObj.tagName == "A") {
  426.       imgElems = tagObj.getElementsByTagName("IMG");
  427.       if (imgElems.length > 0) imgTag = imgElems[0];
  428.     } else if (tagObj.tagName == "AREA") {
  429.       if (tagObj.parentNode && tagObj.parentNode.tagName == "MAP") {
  430.         mapName = "#" + tagObj.parentNode.name;
  431.         imgElems = dw.getDocumentDOM(this.sourceDoc).getElementsByTagName("IMG");
  432.         for (var i=0; !imgTag && i < imgElems.length; i++) {
  433.           if (imgElems[i].usemap == mapName) imgTag = imgElems[i];
  434.       } }
  435.     }
  436.     
  437.     if (imgTag) {
  438.       if (imgTag.name != imgName) imgTag.name = imgName;
  439.       newValue = dw.doURLEncoding((isDown && downImg) ? downImg : upImg);
  440.       if (imgTag.src != newValue) {
  441.         imgTag.src = newValue;
  442.         imgTag.removeAttribute("WIDTH");
  443.         imgTag.removeAttribute("HEIGHT");
  444.       }
  445.       if (behEvent != "onLoad") {
  446.         newValue = insertNBCall(imgTag.onLoad, getOnLoadCall());
  447.         if (imgTag.onLoad != newValue) imgTag.onLoad = newValue;
  448.       }
  449.       if (!imgTag.border) imgTag.border = "0";
  450.     }
  451.  
  452.     if (tagObj.tagName == "IMG") {
  453.       tagObj.outerHTML = getATag() + tagObj.outerHTML + NavBarElem.ATagStop;
  454.     } else if (tagObj.tagName == "A" || tagObj.tagName == "AREA") {
  455.       newValue = (URL) ? URL : "#";
  456.       if (tagObj.href != newValue) tagObj.href = newValue;
  457.       if (tagObj.target || targetWindow)
  458.         if (tagObj.target != targetWindow) tagObj.target = targetWindow;
  459.       if (behEvent != "onClick") {
  460.         newValue = insertNBCall(tagObj.onClick, getOnClickCall());
  461.         if (tagObj.onClick != newValue) tagObj.onClick = newValue;
  462.       }
  463.       if (behEvent != "onMouseOver") {
  464.         newValue = insertNBCall(tagObj.onMouseOver, getOnMouseOverCall());
  465.         if (tagObj.onMouseOver != newValue) tagObj.onMouseOver = newValue;
  466.       }
  467.       if (behEvent != "onMouseOut") {
  468.         newValue = insertNBCall(tagObj.onMouseOut, getOnMouseOutCall());
  469.         if (tagObj.onMouseOut != newValue) tagObj.onMouseOut = newValue;
  470.       }
  471.     }
  472.  
  473.     updatePreloads();
  474.   }
  475. }
  476.  
  477.  
  478. function NavBarElem_updatePreloads() {
  479.   var imgList = ''
  480.   //Add or remove MM_preloadImages() based on checkbox setting
  481.   var obj = dreamweaver.getDocumentDOM(this.sourceDoc).body;
  482.   if (this.preloadOrigId) {
  483.     delHandler(obj,"onLoad","MM_preloadImages", this.preloadId);
  484.   }
  485.   if (this.preloadImages) {
  486.     imgList = this.getPreloadList();
  487.     preloadUpdate(imgList, this.preloadOrigList, 1);
  488.   }
  489. }
  490.  
  491.  
  492. function NavBarElem_parseObjectTag(theTagObj) {
  493.   var imgTag, fnCall, args, imgSrc = '';
  494.   if (theTagObj) with (this) {
  495.     tagObj = theTagObj;
  496.     moveObj = tagObj;
  497.     if (tagObj.tagName == "A" || tagObj.tagName == "AREA") {
  498.       if (tagObj.href && tagObj.href != '#') URL = unescape(tagObj.href);
  499.       if (tagObj.target) targetWindow = tagObj.target;
  500.       if (tagObj.onClick &&
  501.           (fnCall = this.getNBCall(tagObj.onClick)) != '') {  // fill downImages
  502.         args = extractArgs(fnCall);
  503.         groupName = args[2];
  504.         downImg = unescape(args[4]);
  505.         for (var i=5; i+1 < args.length; i+=2) {
  506.           downImages.push(unescape(args[i]));
  507.           downImages.push(unescape(args[i+1]));
  508.         }
  509.         if (args[args.length-1] != '0') {
  510.           preloadImages = true;
  511.           if (args[args.length-1] != '1') preloadOrigId = args[args.length-1];
  512.         } else preloadImages = false;
  513.       }
  514.       if (tagObj.onMouseOver &&
  515.           (fnCall = this.getNBCall(tagObj.onMouseOver)) != '') { // fill overImages
  516.         args = extractArgs(fnCall);
  517.         overImg = unescape(args[3]);
  518.         overDownImg = unescape(args[4]);
  519.         for (var i=5; i+2 < args.length; i+=3) {
  520.           overImages.push(unescape(args[i]));
  521.           overImages.push(unescape(args[i+1]));
  522.           overImages.push(unescape(args[i+2]));
  523.         }
  524.         if (args[args.length-1] != '0') {
  525.           preloadImages = true;
  526.           if (args[args.length-1] != '1') preloadOrigId = args[args.length-1];
  527.         } else preloadImages = false;
  528.       }
  529.       
  530.       // set imgTag
  531.       if (tagObj.tagName == "A") {
  532.         imgElems = tagObj.getElementsByTagName("IMG");
  533.         if (imgElems.length > 0) imgTag = imgElems[0];
  534.       } else if (tagObj.tagName == "AREA") {
  535.         if (tagObj.parentNode && tagObj.parentNode.tagName == "MAP") {
  536.           mapName = "#" + tagObj.parentNode.name;
  537.           imgElems = dw.getDocumentDOM(this.sourceDoc).getElementsByTagName("IMG");
  538.           for (var i=0; !imgTag && i < imgElems.length; i++) {
  539.             if (imgElems[i].usemap == mapName) imgTag = imgElems[i];
  540.         } }
  541.         moveObj = imgTag;
  542.       }
  543.     } else if (tagObj.tagName == "IMG") {
  544.       imgTag = theTagObj;
  545.     }
  546.     if (imgTag) {
  547.       if (imgTag.src)  imgSrc = unescape(imgTag.src);
  548.       if (imgTag.onLoad && (fnCall = this.getNBCall(imgTag.onLoad)) != '') {
  549.         args = extractArgs(fnCall);
  550.         if (args.length > 4) {
  551.           isDown = true;
  552.           groupName = args[2];
  553.           upImg = unescape(args[4]);
  554.         }
  555.       } else upImg = imgSrc;
  556.       if (imgTag.name) {
  557.         imgName = imgTag.name;
  558.         nameAutoSet = false;
  559.       } else {
  560.         setUpImage(upImg);
  561.       }
  562.     }
  563.     if (preloadImages) preloadOrigList = getPreloadList();
  564.   }
  565. }
  566.  
  567.  
  568. function NavBarElem_getATag() {
  569.   var retVal = '';
  570.   retVal += NavBarElem.ATagStart;
  571.   retVal += " " + NavBarElem.ALink + "=\"" + dw.doURLEncoding((this.URL) ? this.URL : "#") + "\"";
  572.   if (this.targetWindow)
  573.     retVal += " " + NavBarElem.ATarget + "=\"" + this.targetWindow + "\"";
  574.   retVal += " " + NavBarElem.AOnClick + "=\"" + this.getOnClickCall() + "\"";
  575.   retVal += " " + NavBarElem.AOnMouseOver + "=\"" + this.getOnMouseOverCall() + "\"";
  576.   retVal += " " + NavBarElem.AOnMouseOut + "=\"" + this.getOnMouseOutCall() + "\"";
  577.   retVal += NavBarElem.CloseTag;
  578.   return retVal;
  579. }
  580.  
  581. function NavBarElem_getOnLoadCall() {
  582.   var retVal = '';
  583.   if (this.isDown && this.downImg) {
  584.     retVal = NavBarElem.UpdateFn + "('init','" + this.groupName + "','" +
  585.              this.imgName + "','" + dw.doURLEncoding(this.upImg) + "'";
  586.     for (var i=0; i < this.downImages.length; i+=2) {
  587.       retVal += ",'" + this.downImages[i] + "','" + dw.doURLEncoding(this.downImages[i+1]) + "'";
  588.     }
  589.     retVal += "," + ((this.preloadImages) ? '1' : '0') + ")";
  590.   }
  591.   return retVal;
  592. }
  593.  
  594. function NavBarElem_getOnClickCall() {
  595.   var retVal = '';
  596.   retVal += NavBarElem.UpdateFn + "('down','" + this.groupName + "','" +
  597.             this.imgName + "','" + dw.doURLEncoding(this.downImg) + "'";
  598.   for (var i=0; i < this.downImages.length; i+=2) {
  599.     retVal += ",'" + this.downImages[i] + "','" + dw.doURLEncoding(this.downImages[i+1]) + "'";
  600.   }
  601.   retVal += "," + ((this.preloadImages) ? '1' : '0') + ")";
  602.   return retVal;
  603. }
  604.  
  605. function NavBarElem_getOnMouseOverCall() {
  606.   var retVal = '';
  607.   retVal += NavBarElem.UpdateFn + "('over','" +
  608.             this.imgName + "','" + dw.doURLEncoding(this.overImg) + "','" + dw.doURLEncoding(this.overDownImg) + "'";
  609.   for (var i=0; i < this.overImages.length; i+=3) {
  610.     retVal += ",'" + this.overImages[i] + "','" +     // img name
  611.               dw.doURLEncoding(this.overImages[i+1]) + "','" +  // over image
  612.               dw.doURLEncoding(this.overImages[i+2]) + "'";     // overDown image
  613.   }
  614.   retVal += "," + ((this.preloadImages) ? '1' : '0') + ")";
  615.   return retVal;
  616. }
  617.  
  618. function NavBarElem_getOnMouseOutCall() {
  619.   var retVal = '';
  620.   retVal += NavBarElem.UpdateFn + "('out')";
  621.   return retVal;
  622. }
  623.  
  624. function NavBarElem_getNBCall(fnCallStr) {
  625.   var retVal = '';
  626.   var callList = dw.getTokens(fnCallStr, ";");
  627.   for (var i=0; !retVal && i < callList.length; i++)
  628.     if (callList[i].indexOf(NavBarElem.UpdateFn) != -1)
  629.       retVal = callList[i];
  630.   return retVal;
  631. }
  632.  
  633.  
  634. function NavBarElem_insertNBCall(eventStr, newFnCallStr) {
  635.   var currCall, index, retVal = eventStr;
  636.   if (!eventStr) {
  637.     retVal = newFnCallStr;
  638.   } else if (eventStr.indexOf(NavBarElem.UpdateFn) == -1) {
  639.     retVal = eventStr + ";" + newFnCallStr;
  640.   } else {
  641.     currCall = this.getNBCall(eventStr);
  642.     index = eventStr.indexOf(currCall);
  643.     retVal = eventStr.substring(0, index) + newFnCallStr +
  644.              eventStr.substring(index+currCall.length);
  645.   }
  646.   return retVal;
  647. }
  648.  
  649. function NavBarElem_getPreloadList() {
  650.   var imgList = new Array();
  651.   with (this) {
  652.     if (isDown) {
  653.       if (upImg) imgList.push(dw.doURLEncoding(upImg));
  654.     } else {
  655.       if (downImg) imgList.push(dw.doURLEncoding(downImg));
  656.     }
  657.     if (overImg) imgList.push(dw.doURLEncoding(overImg));
  658.     if (overDownImg) imgList.push(dw.doURLEncoding(overDownImg));
  659.     for (var i=0; i+2 < overImages.length; i+=3) {
  660.       if (overImages[i+1]) imgList.push(dw.doURLEncoding(overImages[i+1]));
  661.       if (overImages[i+2]) imgList.push(dw.doURLEncoding(overImages[i+2]));
  662.     }
  663.     for (var i=0; i+1 < downImages.length; i+=2) {
  664.       if (downImages[i+1]) imgList.push(dw.doURLEncoding(downImages[i+1]));
  665.     }
  666.   }
  667.   return imgList;
  668. }
  669.  
  670.  
  671. //Returns true if this element is complete
  672. //
  673. function NavBarElem_isComplete() {
  674.   var retVal = false;
  675.   retVal = (this.upImg && this.imgName);
  676.   return retVal;
  677. }
  678.  
  679.  
  680. //Returns the nice name for display in a list of elements
  681. //
  682. function NavBarElem_getViewName() {
  683.   var retVal = '';
  684.   retVal = this.imgName + ((this.isDown) ? " *" : "");
  685.   return retVal;
  686. }
  687.  
  688.  
  689. //Returns a unique element name
  690. //
  691. function NavBarElem_getUniqueName(nameBase, forceNum) {
  692.   var count=1,retVal = '';
  693.   var docDOM = dw.getDocumentDOM(this.sourceDoc);
  694.   var imgList = docDOM.getElementsByTagName("IMG");
  695.   for (var i=0; i < imgList.length; i++) {
  696.     if (imgList[i].name == nameBase + ((!forceNum && count==1) ? '' : count.toString())) {
  697.       count++;
  698.       i = -1; // restart loop
  699.   } }
  700.   if (this.parent) {
  701.     for (var i=0; i < this.parent.elemList.length; i++) {
  702.       if (this.parent.elemList[i] != this) {
  703.         if (this.parent.elemList[i].imgName == nameBase + ((!forceNum && count==1) ? '' : count.toString())) {
  704.           count++;
  705.           i = -1; // restart loop
  706.     } } }
  707.   }
  708.   retVal = nameBase + ((!forceNum && count==1) ? '' : count.toString());
  709.   return retVal;
  710. }
  711.  
  712.  
  713. //Sets the name and updates the auto set flag
  714. //
  715. function NavBarElem_setName(theName) {
  716.   if (this.imgName != theName && theName) {
  717.     this.imgName = this.getUniqueName(theName);
  718.     this.nameAutoSet = false;
  719.   }
  720. }
  721.  
  722.  
  723. //Sets the up images and updates the name of the element
  724. //
  725. function NavBarElem_setUpImage(theImage) {
  726.   var simpleName, index;
  727.   this.upImg = theImage;
  728.   if (theImage && this.nameAutoSet) {
  729.     simpleName = theImage;
  730.     index = simpleName.lastIndexOf(MM.File.separator);
  731.     if (index != -1) 
  732.       simpleName = simpleName.substring(index + MM.File.separator.length);
  733.     index = simpleName.lastIndexOf(MM.File.extensionSep);
  734.     if (index != -1) 
  735.       simpleName = simpleName.substring(0, index);
  736.     simpleName = simpleName.replace(/\W/g, '');
  737.     if (simpleName.search(/\d/) == 0) simpleName = '_' + simpleName;
  738.     if (simpleName)
  739.       this.imgName = this.getUniqueName(simpleName);
  740.   }
  741. }
  742.  
  743.  
  744. //Returns true if the given tag represents a nav bar element
  745. //
  746. function NavBarElem_isValidTag(theTagObj) {
  747.   var retVal = false;
  748.   retVal = (theTagObj.outerHTML.indexOf(NavBarElem.UpdateFn) != -1)
  749.   return retVal;
  750. }
  751.  
  752.  
  753.  
  754. /*------------------------------------------------------------------*/
  755.  
  756. function NavBarView(docObj, theData) {
  757.   //properties
  758.   this.data = theData;
  759.  
  760.   this.elemList = new ListControl('elemList');
  761.   this.layout = new ListControl('layout');
  762.   this.layout.setAll(MENULIST_layout);
  763.   this.useTable = findObject('useTable');
  764.  
  765.   this.prevIndex = '';
  766.  
  767.   this.elemView = new NavBarElemView(docObj);
  768. }
  769.  
  770. //methods
  771. NavBarView.prototype.display = NavBarView_display;
  772. NavBarView.prototype.update  = NavBarView_update;
  773. NavBarView.prototype.storeOptions = NavBarView_storeOptions;
  774. NavBarView.prototype.restoreOptions = NavBarView_restoreOptions;
  775.  
  776.  
  777. function NavBarView_display(index, sameElem) {
  778.   index = (index != null) ? index : 0;
  779.   with (this) {
  780.     elemList.setAll(data.getViewNames());
  781.     if (index < 0) index = 0;
  782.     if (index >= elemList.getLen()) index = elemList.getLen()-1;
  783.     elemList.setIndex(index);
  784.     elemView.setElem(data.getElem(index));
  785.     elemView.display(sameElem);
  786.     layout.setIndex((data.isHorizontal) ? 0 : 1);
  787.     useTable.checked = data.useTable;
  788.     prevIndex = index;
  789.   }
  790. }
  791.  
  792. function NavBarView_update(itemName) {
  793.   var index, origIndex;
  794.   with (this) {
  795.     switch (itemName) {
  796.       case "elemAdd":
  797.         if (data.getElem(elemList.getIndex()).isComplete()) {
  798.           index = data.addElem(elemList.getIndex());
  799.           if (index != -1) display(index);
  800.           else display();
  801.         } else {
  802.           alert(MSG_NeedNameAndImg + MSG_AddingElem);
  803.         }
  804.         break;
  805.       case "elemRemove":
  806.         if (data.elemList.length >= 2) {
  807.           index = elemList.getIndex();
  808.           if (data.removeElem(index)) display(index);
  809.         } else {
  810.           index = elemList.getIndex();
  811.           if (data.removeElem(index)) {
  812.             index = data.addElem();
  813.             if (index != -1) display(index);
  814.             else display();
  815.           }
  816.         }
  817.         break;
  818.       case "elemUp":
  819.         index = data.moveElemUp(elemList.getIndex());
  820.         if (index != -1) display(index, true);
  821.         break;
  822.       case "elemDown":
  823.         index = data.moveElemDown(elemList.getIndex());
  824.         if (index != -1) display(index, true);
  825.         break;
  826.       case "elemList":
  827.         if (data.getElem(prevIndex).isComplete()) {
  828.           index = elemList.getIndex();
  829.           elemView.setElem(data.getElem(index));
  830.           elemView.display();
  831.         } else {
  832.           elemList.setIndex(prevIndex);
  833.           elemView.display();
  834.           alert(MSG_NeedNameAndImg + MSG_SelectElem);
  835.         }
  836.         break;
  837.       case "elemName":
  838.       case "upImg":
  839.       case "isDown":
  840.         elemView.update(itemName);
  841.         elemList.set(data.getElem(elemList.getIndex()).getViewName());
  842.         break;
  843.       case "overImg":
  844.       case "downImg":
  845.       case "overDownImg":
  846.       case "theURL":
  847.       case "theTarget":
  848.       case "preloadImages":
  849.         elemView.update(itemName);
  850.         break;
  851.       case "layout":
  852.         data.isHorizontal = (layout.getIndex() == 0);
  853.         break;
  854.       case "useTable":
  855.         data.useTable = useTable.checked;
  856.         break;
  857.       default:
  858.         //alert("ERROR: UI Update Error - " + itemName);
  859.         break;
  860.     }
  861.   }
  862. }
  863.  
  864.  
  865. function NavBarView_storeOptions(cmdFile) {
  866.   var handle = MMNotes.open(cmdFile, true);
  867.   if (handle != 0) {
  868.     MMNotes.set(handle, "LayoutOption", this.data.isHorizontal.toString());
  869.     MMNotes.set(handle, "TableOption", this.data.useTable.toString());
  870.     MMNotes.close(handle);
  871.   }
  872. }
  873.  
  874.  
  875. function NavBarView_restoreOptions(cmdFile) {
  876.   var handle = MMNotes.open(cmdFile);
  877.   if (handle != 0) {
  878.     this.data.isHorizontal = (MMNotes.get(handle, "LayoutOption") == "false") ? false : true;
  879.     this.data.useTable     = (MMNotes.get(handle, "TableOption")  == "false") ? false : true;
  880.     MMNotes.close(handle);
  881.   }
  882. }
  883.  
  884.  
  885.  
  886. /*------------------------------------------------------------------*/
  887.  
  888. function NavBarElemView(docObj, theElem) {
  889.   //properties
  890.   this.elem = (theElem) ? theElem : '';
  891.   this.elemName = findObject('elemName');
  892.   this.upImg = findObject('upImg');
  893.   this.overImg = findObject('overImg');
  894.   this.downImg = findObject('downImg');
  895.   this.overDownImg = findObject('overDownImg');
  896.   this.theURL = findObject('theURL');
  897.   this.theTarget = new ListControl('theTarget');
  898.   this.preloadImages = findObject('preloadImages');
  899.   this.isDown = findObject('isDown');
  900.  
  901.   // populate the target list
  902.   this.targNames = new Array();
  903.   this.targValues = new Array();
  904.   this.setTargetArrays();
  905.   this.theTarget.setAll(this.targNames, this.targValues);
  906. }
  907.  
  908. //methods
  909. NavBarElemView.prototype.setElem = NavBarElemView_setElem;
  910. NavBarElemView.prototype.display = NavBarElemView_display;
  911. NavBarElemView.prototype.update  = NavBarElemView_update;
  912. NavBarElemView.prototype.setTargetArrays = NavBarElemView_setTargetArrays;
  913.  
  914.  
  915. function NavBarElemView_setElem(theElem) {
  916.   this.elem = theElem;
  917.   this.display();
  918. }
  919.  
  920. //Updates the current view based on the elem settings
  921. //
  922. function NavBarElemView_display(sameElem) {
  923.   if (this.elem) with (this) {
  924.     elemName.value = elem.imgName;
  925.     upImg.value = elem.upImg;
  926.     overImg.value = elem.overImg;
  927.     downImg.value = elem.downImg;
  928.     overDownImg.value = elem.overDownImg;
  929.     theURL.value = elem.URL;
  930.     theTarget.pickValue(elem.targetWindow);
  931.     preloadImages.checked = elem.preloadImages;
  932.     isDown.checked = elem.isDown;
  933.  
  934.     if (!sameElem) {
  935.       elemName.select();
  936.       elemName.focus();
  937.     }
  938.   }
  939. }
  940.  
  941.  
  942. //Updates the current elem based on the item setting
  943. function NavBarElemView_update(itemName) {
  944.   with (this) {
  945.     switch (itemName) {
  946.       case "elemName":
  947.         elem.setName(elemName.value);
  948.         elemName.value = elem.imgName;
  949.         break;
  950.       case "upImg":
  951.         elem.setUpImage(upImg.value);
  952.         display(true);
  953.         break;
  954.       case "overImg":
  955.         elem.overImg = overImg.value;
  956.         break;
  957.       case "downImg":
  958.         elem.downImg = downImg.value;
  959.         break;
  960.       case "overDownImg":
  961.         elem.overDownImg = overDownImg.value;
  962.         break;
  963.       case "theURL":
  964.         elem.URL = theURL.value;
  965.         break;
  966.       case "theTarget":
  967.         elem.targetWindow = theTarget.getValue();
  968.         break;
  969.       case "preloadImages":
  970.         elem.preloadImages = preloadImages.checked;
  971.         break;
  972.       case "isDown":
  973.         elem.isDown = isDown.checked;
  974.         break;
  975.       default:
  976.         //alert("ERROR: UI Update Error - " + itemName);
  977.         break;
  978.     }
  979.   }
  980. }
  981.  
  982.  
  983. function NavBarElemView_setTargetArrays() {
  984.   var docDOM = dw.getDocumentDOM();
  985.   this.targNames  = docDOM.getFrameNames();
  986.   this.targValues = docDOM.getFrameNames();
  987.    //insert main window name and value
  988.   this.targNames.splice(0, 0, TYPE_MainWindow);
  989.   this.targValues.splice(0, 0, '');
  990. }
  991.